package com.bbva.itradecomex.bo.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.context.FacesContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.bbva.itradecomex.bo.iface.RankingClientesBO;
import com.bbva.itradecomex.dao.iface.VistaBancoDAO;
import com.bbva.itradecomex.domain.BancoRankClienteDetalle;
import com.bbva.itradecomex.domain.BancoRankClienteResultado;
import com.bbva.itradecomex.form.RankingClienteBusquedaForm;
import com.bbva.itradecomex.util.Constantes;
import com.bbva.itradecomex.util.ITradexUtil;

@Service
public class RankingClientesBOImpl implements RankingClientesBO {
	
	@Autowired
	private VistaBancoDAO vistaBancoDAO;

	@Override
	public List<BancoRankClienteResultado> getListRankingClienteImport(RankingClienteBusquedaForm form)
			throws Exception {
		return formatListRankingCliente(vistaBancoDAO.getListBanoRankClienteDetImp(form));
	}

	@Override
	public List<BancoRankClienteResultado> getListRankingClienteExport(RankingClienteBusquedaForm form)
			throws Exception {
		return formatListRankingCliente(vistaBancoDAO.getListBanoRankClienteDetExp(form));
	}

	@Override
	public List<BancoRankClienteResultado> getListRankingClienteImpExp(RankingClienteBusquedaForm form)
			throws Exception {
		return formatListRankingCliente(vistaBancoDAO.getListBanoRankClienteDetImpExp(form));
	}

	@Override
	public void setearTotales(
			BancoRankClienteResultado subTotalClienteConClaveImp,
			BancoRankClienteResultado subTotalClienteSinClaveImp,
			BancoRankClienteResultado totalClienteImp,
			List<BancoRankClienteResultado> listaBClienteResultadoImportaciones)
			throws Exception {
		// Importaciones
		// SubTotalClienteImpesConCLave && SubTotalClienteImpesSinCLave
		for (BancoRankClienteResultado bRankClienteResIter : listaBClienteResultadoImportaciones) {
			for(BancoRankClienteDetalle bRankClienteDetaIter: bRankClienteResIter.getListaClaves()){
				if(bRankClienteDetaIter.getTipo().toUpperCase().equals(Constantes.VBANCO_TIPO_CON_CLAVE)){
					subTotalClienteConClaveImp.settMpBcos(ITradexUtil.addBigDecimal(subTotalClienteConClaveImp.gettMpBcos(),bRankClienteDetaIter.getTotBcos()));
					subTotalClienteConClaveImp.settMpOper(ITradexUtil.addBigDecimal(subTotalClienteConClaveImp.gettMpOper(),bRankClienteDetaIter.getTotOper()));
					subTotalClienteConClaveImp.settMpImpUSD(ITradexUtil.addBigDecimal(subTotalClienteConClaveImp.gettMpImpUSD(),bRankClienteDetaIter.getTotImporte()));
					subTotalClienteConClaveImp.setiTeBcos(ITradexUtil.addBigDecimal(subTotalClienteConClaveImp.getiTeBcos(),bRankClienteDetaIter.getTxBcos()));
					subTotalClienteConClaveImp.setiTeOper(ITradexUtil.addBigDecimal(subTotalClienteConClaveImp.getiTeOper(),bRankClienteDetaIter.getTxOper()));
					subTotalClienteConClaveImp.setiTeImpUSD(ITradexUtil.addBigDecimal(subTotalClienteConClaveImp.getiTeImpUSD(),bRankClienteDetaIter.getTxImporte()));
					subTotalClienteConClaveImp.setiCcBcos(ITradexUtil.addBigDecimal(subTotalClienteConClaveImp.getiCcBcos(),bRankClienteDetaIter.getLcBcos()));
					subTotalClienteConClaveImp.setiCcOper(ITradexUtil.addBigDecimal(subTotalClienteConClaveImp.getiCcOper(),bRankClienteDetaIter.getLcOper()));
					subTotalClienteConClaveImp.setiCcImpUSD(ITradexUtil.addBigDecimal(subTotalClienteConClaveImp.getiCcImpUSD(),bRankClienteDetaIter.getLcImporte()));
					subTotalClienteConClaveImp.setiCBcos(ITradexUtil.addBigDecimal(subTotalClienteConClaveImp.getiCBcos(),bRankClienteDetaIter.getClBcos()));
					subTotalClienteConClaveImp.setiCOper(ITradexUtil.addBigDecimal(subTotalClienteConClaveImp.getiCOper(),bRankClienteDetaIter.getClOper()));
					subTotalClienteConClaveImp.setiCImpUSD(ITradexUtil.addBigDecimal(subTotalClienteConClaveImp.getiCImpUSD(),bRankClienteDetaIter.getClImporte()));
					subTotalClienteConClaveImp.setiFOper(ITradexUtil.addBigDecimal(subTotalClienteConClaveImp.getiFOper(),bRankClienteDetaIter.getFiOper()));
					subTotalClienteConClaveImp.setiFImpUSD(ITradexUtil.addBigDecimal(subTotalClienteConClaveImp.getiFImpUSD(),bRankClienteDetaIter.getFiImporte()));
				}else if(bRankClienteDetaIter.getTipo().toUpperCase().equals(Constantes.VBANCO_TIPO_SIN_CLAVE)){
					
					subTotalClienteSinClaveImp.settMpBcos(ITradexUtil.addBigDecimal(subTotalClienteSinClaveImp.gettMpBcos(),bRankClienteDetaIter.getTotBcos()));
					subTotalClienteSinClaveImp.settMpOper(ITradexUtil.addBigDecimal(subTotalClienteSinClaveImp.gettMpOper(),bRankClienteDetaIter.getTotOper()));
					subTotalClienteSinClaveImp.settMpImpUSD(ITradexUtil.addBigDecimal(subTotalClienteSinClaveImp.gettMpImpUSD(),bRankClienteDetaIter.getTotImporte()));
					subTotalClienteSinClaveImp.setiTeBcos(ITradexUtil.addBigDecimal(subTotalClienteSinClaveImp.getiTeBcos(),bRankClienteDetaIter.getTxBcos()));
					subTotalClienteSinClaveImp.setiTeOper(ITradexUtil.addBigDecimal(subTotalClienteSinClaveImp.getiTeOper(),bRankClienteDetaIter.getTxOper()));
					subTotalClienteSinClaveImp.setiTeImpUSD(ITradexUtil.addBigDecimal(subTotalClienteSinClaveImp.getiTeImpUSD(),bRankClienteDetaIter.getTxImporte()));
					subTotalClienteSinClaveImp.setiCcBcos(ITradexUtil.addBigDecimal(subTotalClienteSinClaveImp.getiCcBcos(),bRankClienteDetaIter.getLcBcos()));
					subTotalClienteSinClaveImp.setiCcOper(ITradexUtil.addBigDecimal(subTotalClienteSinClaveImp.getiCcOper(),bRankClienteDetaIter.getLcOper()));
					subTotalClienteSinClaveImp.setiCcImpUSD(ITradexUtil.addBigDecimal(subTotalClienteSinClaveImp.getiCcImpUSD(),bRankClienteDetaIter.getLcImporte()));
					subTotalClienteSinClaveImp.setiCBcos(ITradexUtil.addBigDecimal(subTotalClienteSinClaveImp.getiCBcos(),bRankClienteDetaIter.getClBcos()));
					subTotalClienteSinClaveImp.setiCOper(ITradexUtil.addBigDecimal(subTotalClienteSinClaveImp.getiCOper(),bRankClienteDetaIter.getClOper()));
					subTotalClienteSinClaveImp.setiCImpUSD(ITradexUtil.addBigDecimal(subTotalClienteSinClaveImp.getiCImpUSD(),bRankClienteDetaIter.getClImporte()));
					subTotalClienteSinClaveImp.setiFOper(ITradexUtil.addBigDecimal(subTotalClienteSinClaveImp.getiFOper(),bRankClienteDetaIter.getFiOper()));
					subTotalClienteSinClaveImp.setiFImpUSD(ITradexUtil.addBigDecimal(subTotalClienteSinClaveImp.getiFImpUSD(),bRankClienteDetaIter.getFiImporte()));
				}
			}
		}
		
		// Total Cliente
		for (BancoRankClienteResultado bRankClienteResIter : listaBClienteResultadoImportaciones) {
				
				totalClienteImp.settMpBcos(ITradexUtil.addBigDecimal(totalClienteImp.gettMpBcos(),bRankClienteResIter.gettMpBcos()));
				totalClienteImp.settMpOper(ITradexUtil.addBigDecimal(totalClienteImp.gettMpOper(),bRankClienteResIter.gettMpOper()));
				totalClienteImp.settMpImpUSD(ITradexUtil.addBigDecimal(totalClienteImp.gettMpImpUSD(),bRankClienteResIter.gettMpImpUSD()));
				totalClienteImp.setiTeBcos(ITradexUtil.addBigDecimal(totalClienteImp.getiTeBcos(),bRankClienteResIter.getiTeBcos()));
				totalClienteImp.setiTeOper(ITradexUtil.addBigDecimal(totalClienteImp.getiTeOper(),bRankClienteResIter.getiTeOper()));
				totalClienteImp.setiTeImpUSD(ITradexUtil.addBigDecimal(totalClienteImp.getiTeImpUSD(),bRankClienteResIter.getiTeImpUSD()));
				totalClienteImp.setiCcBcos(ITradexUtil.addBigDecimal(totalClienteImp.getiCcBcos(),bRankClienteResIter.getiCcBcos()));
				totalClienteImp.setiCcOper(ITradexUtil.addBigDecimal(totalClienteImp.getiCcOper(),bRankClienteResIter.getiCcOper()));
				totalClienteImp.setiCcImpUSD(ITradexUtil.addBigDecimal(totalClienteImp.getiCcImpUSD(),bRankClienteResIter.getiCcImpUSD()));
				totalClienteImp.setiCBcos(ITradexUtil.addBigDecimal(totalClienteImp.getiCBcos(),bRankClienteResIter.getiCBcos()));
				totalClienteImp.setiCOper(ITradexUtil.addBigDecimal(totalClienteImp.getiCOper(),bRankClienteResIter.getiCOper()));
				totalClienteImp.setiCImpUSD(ITradexUtil.addBigDecimal(totalClienteImp.getiCImpUSD(),bRankClienteResIter.getiCImpUSD()));
				totalClienteImp.setiFOper(ITradexUtil.addBigDecimal(totalClienteImp.getiFOper(),bRankClienteResIter.getiFOper()));
				totalClienteImp.setiFImpUSD(ITradexUtil.addBigDecimal(totalClienteImp.getiFImpUSD(),bRankClienteResIter.getiFImpUSD()));
		}
	}
	
	private List<BancoRankClienteResultado> formatListRankingCliente(
			List<BancoRankClienteDetalle> listBanoRankClienteDet) {
		List<BancoRankClienteResultado> lstBClienteResultado = null;
		List<BancoRankClienteDetalle> listaClaves = new ArrayList<BancoRankClienteDetalle>() ;
		if (listBanoRankClienteDet != null) {
			lstBClienteResultado = new ArrayList<BancoRankClienteResultado>();

			BigDecimal totalBcos = new BigDecimal(0);
			BigDecimal totalOper = new BigDecimal(0);
			BigDecimal totalImporte = new BigDecimal(0);
			BigDecimal iTeBcos = new BigDecimal(0);
			BigDecimal iTeOper = new BigDecimal(0);
			BigDecimal iTeImpUSD = new BigDecimal(0);
			BigDecimal iCcBcos = new BigDecimal(0);
			BigDecimal iCcOper = new BigDecimal(0);
			BigDecimal iCcImpUSD = new BigDecimal(0);
			BigDecimal iCBcos = new BigDecimal(0);
			BigDecimal iCOper = new BigDecimal(0);
			BigDecimal iCImpUSD = new BigDecimal(0);
			BigDecimal iFOper = new BigDecimal(0);
			BigDecimal iFImpUSD = new BigDecimal(0);
			BancoRankClienteDetalle tmpBancoRankClienteDetSig=new BancoRankClienteDetalle();

			// 02.Se arma el subListado
			for (int i = 0; i < listBanoRankClienteDet.size(); i++) {
				BancoRankClienteDetalle bancoRankClienteDetalle = listBanoRankClienteDet.get(i);
				if(i < (listBanoRankClienteDet.size()-1))
					tmpBancoRankClienteDetSig=listBanoRankClienteDet.get(i+1);
				
				totalBcos=ITradexUtil.addBigDecimal(totalBcos,bancoRankClienteDetalle.getTotBcos());
				totalOper=ITradexUtil.addBigDecimal(totalOper,bancoRankClienteDetalle.getTotOper());
				totalImporte=ITradexUtil.addBigDecimal(totalImporte,bancoRankClienteDetalle.getTotImporte());
				iTeBcos=ITradexUtil.addBigDecimal(iTeBcos,bancoRankClienteDetalle.getTxBcos());
				iTeOper=ITradexUtil.addBigDecimal(iTeOper,bancoRankClienteDetalle.getTxOper());
				iTeImpUSD=ITradexUtil.addBigDecimal(iTeImpUSD,bancoRankClienteDetalle.getTxImporte());
				iCcBcos=ITradexUtil.addBigDecimal(iCcBcos,bancoRankClienteDetalle.getLcBcos());
				iCcOper=ITradexUtil.addBigDecimal(iCcOper,bancoRankClienteDetalle.getLcOper());
				iCcImpUSD=ITradexUtil.addBigDecimal(iCcImpUSD,bancoRankClienteDetalle.getLcImporte());
				iCBcos=ITradexUtil.addBigDecimal(iCBcos,bancoRankClienteDetalle.getClBcos());
				iCOper=ITradexUtil.addBigDecimal(iCOper,bancoRankClienteDetalle.getClOper());
				iCImpUSD=ITradexUtil.addBigDecimal(iCImpUSD,bancoRankClienteDetalle.getClImporte());
				iFOper=ITradexUtil.addBigDecimal(iFOper,bancoRankClienteDetalle.getFiOper());
				iFImpUSD=ITradexUtil.addBigDecimal(iFImpUSD,bancoRankClienteDetalle.getFiImporte());
				listaClaves.add(bancoRankClienteDetalle);
				
				if (!tmpBancoRankClienteDetSig.getCodCliente().equals(bancoRankClienteDetalle.getCodCliente()) || i==(listBanoRankClienteDet.size()-1) ) {
					BancoRankClienteResultado bClienteResultado = new BancoRankClienteResultado(
							bancoRankClienteDetalle.getCodCliente(),
							bancoRankClienteDetalle.getDescCliente(), 
							totalBcos, totalOper, totalImporte, iTeBcos,
							iTeOper, iTeImpUSD, iCcBcos, iCcOper, iCcImpUSD,
							iCBcos, iCOper, iCImpUSD, iFOper, iFImpUSD);
					bClienteResultado.setListaClaves(listaClaves);
					lstBClienteResultado.add(bClienteResultado);
					
					totalBcos = new BigDecimal(0);
					totalOper = new BigDecimal(0);
					totalImporte = new BigDecimal(0);
					iTeBcos = new BigDecimal(0);
					iTeOper = new BigDecimal(0);
					iTeImpUSD = new BigDecimal(0);
					iCcBcos = new BigDecimal(0);
					iCcOper = new BigDecimal(0);
					iCcImpUSD = new BigDecimal(0);
					iCBcos = new BigDecimal(0);
					iCOper = new BigDecimal(0);
					iCImpUSD = new BigDecimal(0);
					iFOper = new BigDecimal(0);
					iFImpUSD = new BigDecimal(0);
					listaClaves = new ArrayList<BancoRankClienteDetalle>();
				}
			}
		}
		return lstBClienteResultado;
	}

	@Override
	public void generaPDFRankingCliente(
			Integer impoExpo,
			FacesContext facesContext,
			List<BancoRankClienteResultado> listaBClientesResultado,
			RankingClienteBusquedaForm filtros,
			BancoRankClienteResultado subTotalClienteConClave,
			BancoRankClienteResultado subTotalClienteSinClave,
			BancoRankClienteResultado totales,String strTipoArchivoExportacion) throws Exception {
		
		Map<String,Object> parametros = new HashMap<String, Object>();
		String strNombrePDF = "Ranking_Clientes_";		
		parametros.put("titulo","RANKING CLIENTES");
		if (impoExpo==Constantes.TIPO_IMPORTACION_VAL){
			parametros.put("expoImpo","IMPORTACIONES");
			strNombrePDF+="IMPO_";
		}
		else if(impoExpo==Constantes.TIPO_EXPORTACION_VAL){
			parametros.put("expoImpo","EXPORTACIONES");
			strNombrePDF+="EXPO_";
		}
		else if(impoExpo==Constantes.TIPO_IMPOEXPO_VAL){
			parametros.put("expoImpo","IMPORTACIONES Y EXPORTACIONES");
			strNombrePDF+="IMPOEXPO_";
		}
		parametros.put("filPais",ITradexUtil.toString(filtros.getStrDescPais()));
		parametros.put("filDescBanco",ITradexUtil.toString(filtros.getStrDescBanco()));
		parametros.put("filClave",filtros.getStrExcluClave());
		parametros.put("filGrupo",filtros.getStrExcluGrupo());
		parametros.put("filFechaIni",filtros.getDtFechaIni());
		parametros.put("filFechaFin",filtros.getDtFechaFin());
		if(filtros.getLngTopCliente()!=null && filtros.getLngTopCliente() > 0)
			parametros.put("filTopBanco",filtros.getLngTopCliente());
		parametros.put("filAladi",filtros.getStrExcluOpera());
		
		if(totales==null)totales=new BancoRankClienteResultado();
		if(subTotalClienteConClave==null)subTotalClienteConClave=new BancoRankClienteResultado();
		if(subTotalClienteSinClave==null)subTotalClienteSinClave=new BancoRankClienteResultado();

		parametros.put("subTotalConClaveBcos",subTotalClienteConClave.gettMpBcos());
		parametros.put("subTotalConClaveOper",subTotalClienteConClave.gettMpOper());
		parametros.put("subTotalConClaveImporte",subTotalClienteConClave.gettMpImpUSD());
		parametros.put("subTotalConClaveTeBcos",subTotalClienteConClave.getiTeBcos());
		parametros.put("subTotalConClaveTeOper",subTotalClienteConClave.getiTeOper());
		parametros.put("subTotalConClaveiTeImpUSD",subTotalClienteConClave.getiTeImpUSD());
		parametros.put("subTotalConClaveiCcBcos",subTotalClienteConClave.getiCcBcos());
		parametros.put("subTotalConClaveiCcOper",subTotalClienteConClave.getiCcOper());
		parametros.put("subTotalConClaveiCcImpUSD",subTotalClienteConClave.getiCcImpUSD());
		parametros.put("subTotalConClaveiCBcos",subTotalClienteConClave.getiCBcos());
		parametros.put("subTotalConClaveiCOper",subTotalClienteConClave.getiCOper());
		parametros.put("subTotalConClaveiCImpUSD",subTotalClienteConClave.getiCImpUSD());
		parametros.put("subTotalConClaveiFOper",subTotalClienteConClave.getiFOper());
		parametros.put("subTotalConClaveiFImpUSD",subTotalClienteConClave.getiFImpUSD());
		
		parametros.put("subTotalSinClaveBcos",subTotalClienteSinClave.gettMpBcos());
		parametros.put("subTotalSinClaveOper",subTotalClienteSinClave.gettMpOper());
		parametros.put("subTotalSinClaveImporte",subTotalClienteSinClave.gettMpImpUSD());
		parametros.put("subTotalSinClaveTeBcos",subTotalClienteSinClave.getiTeBcos());
		parametros.put("subTotalSinClaveTeOper",subTotalClienteSinClave.getiTeOper());
		parametros.put("subTotalSinClaveiTeImpUSD",subTotalClienteSinClave.getiTeImpUSD());
		parametros.put("subTotalSinClaveiCcBcos",subTotalClienteSinClave.getiCcBcos());
		parametros.put("subTotalSinClaveiCcOper",subTotalClienteSinClave.getiCcOper());
		parametros.put("subTotalSinClaveiCcImpUSD",subTotalClienteSinClave.getiCcImpUSD());
		parametros.put("subTotalSinClaveiCBcos",subTotalClienteSinClave.getiCBcos());
		parametros.put("subTotalSinClaveiCOper",subTotalClienteSinClave.getiCOper());
		parametros.put("subTotalSinClaveiCImpUSD",subTotalClienteSinClave.getiCImpUSD());
		parametros.put("subTotalSinClaveiFOper",subTotalClienteSinClave.getiFOper());
		parametros.put("subTotalSinClaveiFImpUSD",subTotalClienteSinClave.getiFImpUSD());
		
		parametros.put("totalBcos",totales.gettMpBcos());
		parametros.put("totalOper",totales.gettMpOper());
		parametros.put("totalImporte",totales.gettMpImpUSD());
		parametros.put("totalTeBcos",totales.getiTeBcos());
		parametros.put("totalTeOper",totales.getiTeOper());
		parametros.put("totaliTeImpUSD",totales.getiTeImpUSD());
		parametros.put("totaliCcBcos",totales.getiCcBcos());
		parametros.put("totaliCcOper",totales.getiCcOper());
		parametros.put("totaliCcImpUSD",totales.getiCcImpUSD());
		parametros.put("totaliCBcos",totales.getiCBcos());
		parametros.put("totaliCOper",totales.getiCOper());
		parametros.put("totaliCImpUSD",totales.getiCImpUSD());
		parametros.put("totaliFOper",totales.getiFOper());
		parametros.put("totaliFImpUSD",totales.getiFImpUSD());
		
		//if(listaBClientesResultado==null)listaBClientesResultado = new ArrayList<BancoRankClienteResultado>();
		strNombrePDF=strNombrePDF+"_"+"[FechaInformacion]";
		if (strTipoArchivoExportacion.equals(Constantes.TIPO_ARCHIVO_EXPORTACION_PDF)){
			ITradexUtil.exportPDF(parametros, listaBClientesResultado, "/xmlReport/banco/rankingClientes/rankingClientes.jasper", strNombrePDF);	
		}else if (strTipoArchivoExportacion.equals(Constantes.TIPO_ARCHIVO_EXPORTACION_XLS)){
			parametros.put("listaBClientesResultado", listaBClientesResultado);
			ITradexUtil.exportXLSJasperEmptyDS(parametros, "/xmlReport/banco/rankingClientes/rankingClientes_Excel.jasper", strNombrePDF);
		}
	}
}
